#include <TimerOne.h>
const int IR_Pin = 9; // 设置输出引脚（Timer1的输出引脚只能为D9或D10

void IR_Init() {
  pinMode(IR_Pin, OUTPUT);  // 设置输出引脚为输出模式，以驱动红外发射模块
  // 配置 Timer1
  Timer1.initialize(26);  // 设置周期为26微秒，等于38kHz，从而用于发射PWM波
  //注：如果用while+delay+手动翻转引脚电平的方式，无法发送频率高至38Khz的PWM波，推测为硬件缺陷，因此使用定时器
}
//注：Arduino中int为16位，long为32位
//delayMicroseconds支持的上限为16383,而int类型最大值为2^15，有必要编写支持更长时间的微秒级延时函数
void Delay_us(long us) { 
  while(us > 10000) {
    delayMicroseconds(10000);
    us -= 10000;
  }
  delayMicroseconds(us);
}
//以38Khz的频率发射红外线
void IR_Enlight() {
  Timer1.pwm(IR_Pin, 512); // 设置 PWM 输出，512 表示 50% 占空比
}
//停止发射红外线
void IR_Dislight() {
  Timer1.pwm(IR_Pin, 0);
}
//NEC协议的数据部分，可解析字符串并以NEC协议连续发送数据部分
void IR_SendStringBits(char *str) { //如字符串'01001110"
	while(*str) {
		IR_SendBit(*str & 0x0f);
		str++;
	}
}
//NEC协议的起始信号
void IR_SendHead(void) {
	IR_Enlight();
	Delay_us(9010);
	IR_Dislight();
	Delay_us(4505);
}
//NEC协议的连接信号，用于两条指令的连接
void IR_SendCat(void) {
	IR_Enlight();
	Delay_us(680);
	IR_Dislight();
	Delay_us(19975);
}
//NEC协议的长连接信号，用于重播时的连接，以及作为结束信号
void IR_SendLongCat(void) {
	IR_Enlight();
	Delay_us(680);
	IR_Dislight();
	Delay_us(39950);
}
//以38Khz闪烁680us后熄灭1630us，表示二进制的1
void IR_SendHigh(void) { //注意，对于接收方来说，SendHigh会在红外接受器中收到低电平
	IR_Enlight();
	Delay_us(680);
	IR_Dislight();
	Delay_us(1630);
}
//以38Khz闪烁680us后熄灭510us，表示二进制的0
void IR_SendLow(void) {
	IR_Enlight();
	Delay_us(680);
	IR_Dislight();
	Delay_us(510);
}

void IR_SendBit(char bit) {
	bit ? IR_SendHigh() : IR_SendLow();
}





